package com.anzia.storeback.service.impl;

import com.anzia.storeback.dao.OrderDao;
import com.anzia.storeback.entity.Order;
import com.anzia.storeback.service.OrderService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

import java.math.BigDecimal;
import java.util.List;
import java.util.Map;

/**
 *@ClassName OrderServiceImpl
 *@Description
 *@Author Anzia.
 *@Date 2021/5/30 21:58
 *@Version 1.0
 **/
@Service("orderService")
public class OrderServiceImpl implements OrderService {

    // 购物车
    @Autowired
    private OrderDao orderDao;

    @Autowired
    private RedisTemplate redisTemplate;

    // 为啥要存到redis中呢？

    @Override
    public void addOrder(Long order_id, int user_id, int product_id, int product_num, BigDecimal product_price) {

        // 添加购物车订单信息
        /**
         * 对于一个商城的秒杀业务，其访问量无疑是巨大的，为此，我们应该将一些固定不变的信息提前抽取到redis中，
         * 而不是在用户进行秒杀活动的时候再去数据库查询。比如商品的名称、商品的描述、商品的秒杀价格等等，
         * 这些都是在活动即将开始之前就确认好并且不会改变的，我们将其存放到redis中
         */
        /**
         * 然而对于json字符串方式的存储，其弊端是非常明显的，因为若是要修改商品中的数据，
         * 则修改操作就会变得非常麻烦，为此，我们可以使用hash类型来存储
         * */
        orderDao.addOrder(order_id, user_id, product_id, product_num, product_price);
        // 创建一个redis的map对象，key值为sales_num
        Map sales_num = redisTemplate.opsForHash().entries("sales_num");

        if (sales_num.isEmpty() || sales_num.get(product_id + "") == null) {
            // 如果为空，则直接添加商品id和商品数量
            sales_num.put(product_id + "", product_num);
        } else {
            // 如果不为空，则要在数目部分，先根据id取出商品数再加上新商品信息的数目，记得类型转换！
            sales_num.put(product_id + "", (int)sales_num.get(product_id + "") + product_num);
        }
        redisTemplate.opsForHash().putAll("sales_num", sales_num);

    }

    @Override
    public void addOrderNoPay(Long order_id, int user_id, int product_id, int product_num, BigDecimal product_price) {
        orderDao.addOrderNoPay(order_id, user_id, product_id, product_num, product_price);
    }

    @Override
    public List<Order> getOrders(Long order_id) {
        return orderDao.getOrders(order_id);
    }

    @Override
    public List<Long> getOrderIdByUser(int user_id) {
        return orderDao.getOrderIdByUser(user_id);
    }

    @Override
    public Long getOrderId() {
        return orderDao.getOrderId();
    }

    @Override
    public int orderPay(Integer user_id, Long order_id) {

        // 如果支付订单信息为空
        if (user_id == null || order_id == null) {
            return 0;
        }
        // 根据id获取订单信息
        List<Order> orders = orderDao.getOrders(order_id);
        Map sales_num = redisTemplate.opsForHash().entries("sales_num");
        for (Order order : orders) {

            int product_id = order.getProduct_id();
            int product_num = order.getProduct_num();

            // 更新最新的支付订单内容
            if(sales_num.isEmpty() || sales_num.get(product_id + "") == null) {
                sales_num.put(product_id + "", product_num);
            } else {
                sales_num.put(product_id + "", (int)sales_num.get(product_id + "") + product_num);
            }
            redisTemplate.opsForHash().putAll("sales_num", sales_num);

        }
        return orderDao.orderPay(user_id, order_id);

    }
}
